package com.youth.oauth.controller;


import cn.hutool.json.JSONUtil;
import com.youth.oauth.commons.beans.ADUser;
import com.youth.oauth.commons.beans.ADUserPrincipal;
import com.youth.oauth.commons.beans.Result;
import com.youth.oauth.commons.utils.JwtUtil;
import com.youth.oauth.config.redis.RedisClient;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 登录控制器，处理登录相关的请求
@RestController
public class LoginController {

    // 注入认证管理器，用于验证用户身份
    @Resource
    private AuthenticationManager authenticationManager;

    // 注入Redis客户端，用于存储登录状态信息
    @Resource
    RedisClient redisClient;

    /**
     * 登录接口，验证用户身份并返回Token
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录结果，包含Token信息
     */
    @PostMapping("/login")
    public Result login(String username, String password) {

        // 创建认证令牌，包含用户名和密码
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
        try {
            // 验证用户身份
            Authentication authentication = authenticationManager.authenticate(token);
            if(authentication.isAuthenticated()) {

                // 1. 删除旧 token（如果存在）
                String oldToken = redisClient.get("login:token:" + username);
                if (oldToken != null) {
                    redisClient.del("login:token:" + username); // 删除 token -> user 映射
                }

                // 模拟用户角色信息
                List<String> roles = new ArrayList<>();
                if(username.equals("karry_bai")) {
                    roles.add("ROLE_ADMIN"); // 管理员角色
                } else {
                    roles.add("ROLE_USER");  // 普通用户角色
                }

                // 模拟用户权限信息
                List<String> permissions = new ArrayList<>();
                permissions.add("add");
                permissions.add("del");

                // 获取登录用户AD信息
                ADUser adUser = JSONUtil.toBean(JSONUtil.toJsonStr(authentication.getPrincipal()), ADUser.class);

                // 封装登录用户信息 (包含 用户AD信息、角色信息、权限信息)
                ADUserPrincipal principal = new ADUserPrincipal(adUser, roles, permissions);

                // 生成Token
                String jwtToken = JwtUtil.generateToken(username);

                // 将登录用户信息存储到Redis中，设置过期时间为1小时
                redisClient.set("login:token:" + username, JSONUtil.toJsonStr(principal),60 * 60 * 1000L);
                Map<String, Object> map = new HashMap<>();
                map.put("token", jwtToken);
                return Result.ok(map);
            } else {
                return Result.error("认证失败");
            }
        } catch (BadCredentialsException e ) {
            return Result.error("用户或密码错误");
        } catch (AuthenticationException e) {
            return Result.error("认证失败" + e.getMessage());
        }

    }

}

